home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
001-025
/
scopedisk24
/
qrt14src
/
relpos.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-18
|
3KB
|
118 lines
/**********************************************************
Relative position module. This is used for patterns:
when an object intersection is found, its location is
passed to one of these routines, which returns two
object-relative coordinates.
**********************************************************/
#include "qrt.h"
/* #define RELPOSDEBUG 1 */
/**********************************************************
Finds relative coords on plane given position in space.
object should be parallelogram or ring.
loc is point in space.
pos1, pos2 are set to relative coords.
**********************************************************/
Plane_Pos(obj,loc,pos1,pos2)
OBJ_PTR obj;
VECT_PTR loc;
float *pos1, *pos2;
{
VECTOR delta;
register float len1, len2;
# ifdef ROBUST
if (!((obj->type == RING) ||
(obj->type == PARALLELOGRAM) ||
(obj->type == RING) ||
(obj->type == TRIANGLE)))
Error(INTERNAL_ERROR,701);
# endif
VecSubtract(&delta,loc,&(obj->loc));
len1 = sqrt(DotProd(obj->vect1,obj->vect1));
len2 = sqrt(DotProd(obj->vect2,obj->vect2));
*pos1 = DotProd(delta,obj->vect1)/len1;
*pos2 = DotProd(delta,obj->vect2)/len2;
# ifdef RELPOSDEBUG
printf("PLANEPOS: len1,2 = %f %f\n",len1,len2);
printf(" pos1,2 = %f %f\n",*pos1,*pos2);
# endif
}
/**********************************************************
Finds relative coords on sphere given position in space
obj->vect1.x = radius of sphere
**********************************************************/
Sphere_Pos(obj,loc,pos1,pos2)
OBJ_PTR obj;
VECT_PTR loc;
float *pos1, *pos2;
{
float atan2w();
VECTOR delta;
# ifdef ROBUST
if (obj->type!=SPHERE) Error(INTERNAL_ERROR,702);
# endif
VecSubtract(&delta,loc,&(obj->loc));
# ifdef ROBUST
if (delta.x==0 && delta.y==0 && delta.z==0)
Error(INTERNAL_ERROR,703);
# endif
*pos1 = atan2w(delta.x,delta.y) * obj->vect1.x;
*pos2 = atan2w(sqrt(sqr(delta.x)+sqr(delta.y)),delta.z) *
obj->vect1.x;
# ifdef RELPOSDEBUG
printf("SPHEREPOS: pos1,2 = %f %f\n",*pos1,*pos2);
# endif
}
/**********************************************************
Finds relative coords on quadratic given position in space
**********************************************************/
Quadratic_Pos(obj,loc,pos1,pos2)
OBJ_PTR obj;
VECT_PTR loc;
float *pos1, *pos2;
{
VECTOR newpos;
VecSubtract(&newpos,loc,&(obj->loc));
*pos1 = newpos.x; /** This isn't right! **/
*pos2 = newpos.y; /** fix it later **/
# ifdef RELPOSDEBUG
printf("QUADRATICPOS: pos1,2 = %f %f\n",*pos1,*pos2);
# endif
}